package com.itheima.interceptor;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
   1:实现 HandlerInterceptor接口  重写所有的方法
      注册之前要先让spring发现有这个对象 @Component
   2:注册
 */
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {

    // 选择重写  ctrl+o

    /**
     *  preHandle  目标资源执行前执行 实现拦截功能方法
     * @param request  请求
     * @param response  响应
     * @param handler   目标资源方法的对象形式...暂时没什么用
     * @return   true 放行  false 不放行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截过滤任务--登录校验  ");
        // 1 2 拦截器已经不拦截login 不需要获取路径 不需要判断
        String url = request.getRequestURL().toString();
        //3:获取请求头中  token 令牌
        String token = request.getHeader("token");
        //4: 如果令牌不存在 不放行 返回 NOT_LOGIN
        if(token==null||token.length()==0){//说明token没有

            log.info(url+":您没有带token来,说明是没有登录过....");
            //返回错误信息
            Result result = Result.error("NOT_LOGIN");
            // 把数据转换json  导入fastjson依赖
            String jsonString = JSON.toJSONString(result);
            //只能使用 Response响应
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            return false;//后面不用执行了
        }
        //5: 令牌存在, 校验是否 有效
        // 有异常 说明 无效
        // 没有异常 说明有效
        try{
            Claims claims = JwtUtils.parseJWT(token);
            //claims 前后端交互的数据
            //有效
        }catch (Exception e){
            log.info(url+":您带token来,令牌失效...");
            //无效
            //返回错误信息
            Result result = Result.error("NOT_LOGIN");
            // 把数据转换json  导入fastjson依赖
            String jsonString = JSON.toJSONString(result);
            //只能使用 Response响应
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            return false;//后面不用执行了
        }

        //6: 有效就放行
//        chain.doFilter(request, response);//写这里可以
        log.info(url+"：令牌有效,可以访问");
        return true;
    }

}
